package com.woniu.teachmall.service;

import com.woniu.teachmall.entity.Goods;
import com.woniu.teachmall.mapper.GoodsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * 商品核心服务实现
 * 提供商品数据管理、分页查询、库存操作及缓存集成功能
 */
@Service
public class GoodsService {
    // 商品数据访问接口（MyBatis Mapper）
    @Autowired
    private GoodsMapper goodsMapper;

    // Redis缓存服务组件
    @Autowired
    private RedisService redisService;

    /**
     * 获取全量商品列表
     * @return 所有商品集合（未启用分页）
     * @apiNote 适用于数据量较小的场景，大数据量建议使用分页接口
     */
    public List<Goods> selectAll() {
        return goodsMapper.selectAll();
    }

    /**
     * 查询最新上架商品
     * @return 按上架时间倒序排列的最新商品集合
     */
    public List<Goods> selectAllNew() {
        return goodsMapper.selectAllNew();
    }

    /**
     * 分页查询商品数据（带缓存机制）
     * @param page 当前页码（从1开始计数）
     * @param pageSize 每页显示记录数
     * @param searchName 商品名称搜索关键词（支持模糊查询）
     * @return 分页后的商品数据集合
     * @implNote 1.自动计算偏移量 2.采用先查库后缓存的策略 3.每次查询刷新缓存
     */
    public List<Goods> findByPage(int page, int pageSize, String searchName) {
        System.out.println("新建或更新缓存：第"+page+"页数据");
        // 计算分页偏移量
        int offset = (page - 1) * pageSize;
        // 从数据库获取分页数据
        List<Goods> goods = goodsMapper.selectByPage(offset, pageSize, searchName);
        // 缓存当前分页数据
        redisService.cacheGoodsPage(page, goods);
        return goods;
    }

    /**
     * 获取符合搜索条件的商品总数
     * @param searchName 商品名称搜索关键词
     * @return 匹配的记录总数
     */
    public long count(String searchName) {
        return goodsMapper.count(searchName);
    }

    /**
     * 根据商品ID查询商品详情
     * @param id 商品唯一标识
     * @return 商品详细信息（包含库存等关键字段）
     */
    public Goods findById(int id) {
        return goodsMapper.findById(id);
    }

    /**
     * 扣减商品库存数量
     * @param goodid 商品ID
     * @param num 需要扣减的库存数量
     * @apiNote 需确保库存充足，建议在事务中调用
     */
    public void reduceStock(Integer goodid, Integer num) {
        goodsMapper.reduceStock(goodid, num);
    }

    /**
     * 新增商品记录
     * @param goods 商品实体对象（需包含完整字段信息）
     */
    public void addGoods(Goods goods) {
        goodsMapper.insertGoods(goods);
    }
}